
var request = require('request');
var async = require('async');
var driver = require('../dao/db');
var Iconv = require('iconv-lite');
var url_node = require('url');
var utils = require('../dao/utils');

var spider = {};
var _default = {};


function sort(news) {

    let str = news.toUpperCase().split('');

    var temp = [];
    for (var i = 0; i < str.length; i++) {
        var _s = str[i];

        if (_s >= 0 && _s <= 9) {
            temp.push(_s);
        }
    }

    if (temp.length == 0) {
        return false;
    } else {
        return temp.join('').replace(/(^\s*)|(\s*$)/g, "");
    }

}

// init
spider.init = function (setting) {
    _default = setting;

    _default.mongdb.database = "mongodb://localhost:27017/" + _default.mongdb.database;


    spider.start(_default);
};
spider.init_d = function (setting) {
    _default = setting;

    _default.mongdb.database = "mongodb://localhost:27017/" + _default.mongdb.database;

    // singel get
    spider.loopGetOne(_default);
};

spider.init_concat = function (setting) {
    _default = setting;

    _default.mongdb.database = "mongodb://localhost:27017/" + _default.mongdb.database;


    spider.loopGetOne(_default);
};
// page get
spider.start = function (_default) {

    var start = _default.start;

    var url = start.url.replace('*PageReplace*', start.curPage);


    // 开始爬取
    spider.spider(url, _default);

};

var times = 0;
spider.spider = function (url, _default) {
    //is finish
    if (_default.isFinish(_default)) {

        return;
    }
    console.log("spider url:" + url);
    // url request
    request({ url: url, headers: _default.headers, encoding: null, timeout: _default.start.timeout }, function (err, res, body) {
        if (err) {
            console.log(err);
            if(times<16){
                setTimeout(()=>{
                    spider.spider(url, _default);
                    times++;
                },1000);
                
            }else{
                times = 0;
                spider.loopGetOne(_default);
            }
            
            return;
        }
        
        try {
            // body buffer
            var data = _default.parse.handel(body, _default,url);

            if (!data) {
                _default.errorHandel('error:没有数据');
                
                if(times<16){
                    spider.spider(url, _default);
                    times++;
                }else{
                    times = 0;
                    spider.loopGetOne(_default);
                }
                
                return;
            }

            if (_default.mongdb.type == 'update') {
                
                spider.updateOne(data, _default);

            } else if (_default.mongdb.type == 'insert') {

                if (_default.mongdb.insertType == 'one') {
                    for(var i = 0;i<data.length;i++){
                        var  _ite_data= data[i];
                        spider.insertOne(_ite_data, _default);
                    }
                    
                } else {
                    spider.insertMany(data, _default);
                }

            } else {

            }
        } catch (e) {
            _default.errorHandel(e);
        }
        times = 0;

    });
};

spider.insertMany = function (data, _default) {
    var url = _default.mongdb.database;
    var table = _default.mongdb.collection;
    async.waterfall([
        // 连接数据库        
        function (callback) {
            driver.connect(callback, url);
        },
        // insertMany
        function (db, callback) {
            driver.insertMany(db, callback, table, data);
        },
        function (db, res, callback) {
            driver.close(db, res, callback);
        }
    ],
        // result
        function (err, result) {
            console.log("resulte");

            if (err) {
                _default.errorHandel(err);
                return;
            }
            _default.successHandel(_default);
        }
    );
};

spider.insertOne = function (data, _default) {
    var url = _default.mongdb.database;
    var table = _default.mongdb.collection;

    var _query = {"title":data['title']};

    data['spiderTime'] = utils.timeFormat(new Date());

    async.waterfall([
        // 连接数据库        
        function (callback) {
            driver.connect(callback, url);
        },
        // 查找
        function (db, callback) {
            driver.find(db, callback, table, _query);
        },
        // 
        function (db, res, callback) {
            // 未找到记录
            if (res.success && res.data.length == 0) {
                driver.insert(db, callback, table, data);
            } else {
                // 已存在数据库
                callback(null, db, res);
            }
        },
        function (db, res, callback) {
            driver.close(db, res, callback);
        }
    ],
        // result
        function (err, result) {
            console.log("resulte");

            if (err) {
                _default.errorHandel(err);
                return;
            }
            _default.successHandel(_default);
        }
    );
};

// 从数据看中获取单条数据
spider.loopGetOne = function (_default) {
    var url = _default.mongdb.database;
    var table = _default.mongdb.collection;


    if (_default.lastId) {
        _query = { "_id": { $gt: require('mongodb').ObjectId(_default.lastId) } };
    } else {
        _query = {};
    }

    async.waterfall([
        // 连接数据库        
        function (callback) {
            driver.connect(callback, url);
        },
        // 查找
        function (db, callback) {
            driver.pageById(db, callback, table, _query, 1);
            // driver.page(db, callback, table, {}, _default.p, 1);
        },

        function (db, res, callback) {
            driver.close(db, res, callback);
        }
    ],
        // result
        function (err, result) {
            console.log("--loopGetOne resulte --");
            console.log('');

            if (err) {
                _default.errorHandel(err);
                return;
            }

            if (result.success) {
                var data = result.data;
                if (data.length == 0) {

                    console.log('fetch all');

                } else {
                    var _id = data[0]['_id'];
                    _default.lastId = _id;

                    // 更新
                    if (_default.mongdb.type == 'update') {

                        var url = data[0]['href'];   
                        
                        var iFinish = data[0]['isFinish'];

                        _default.sdata = data[0];
                        // 条件认证
                        if(_default.validate(data[0])){

                            spider.loopGetOne(_default);
                            console.log('动画已完结。。。。');
                            console.log('');
                            return;
                        }
                        console.log({title:data[0]['title'],"_id":_id});
                        // spider
                        spider.spider(url, _default);

                    // 合并
                    }else if(_default.mongdb.type == 'concat'){
                        delete data[0]['_id'];
                        spider.baseConcat(data[0],_default);
                    }else{
                        console.log('没有匹配的mongdb.type ');
                    }

                }
            } else {
                console.log('error');
                console.log(result);
            }
        }
    );
};

// 数据库详情更新
spider.updateOne = function (data, _default) {
    var url = _default.mongdb.database;
    var table = _default.mongdb.collection;
    
    data['spiderTime'] = utils.timeFormat(new Date());

    if(_default.sdata.chapters.length == data.chapters.length){

        if(_default.sdata['isUpdate'] == true){
            data = null;
            data = {"isUpdate":false};
        }
        _default.sdata = null;
       
        // spider.loopGetOne(_default);
        // return;
    }else{
        data['isUpdate'] = true;
    }


    var _query = { "_id": require('mongodb').ObjectId(_default.lastId) };
    console.log('------update data----');
    console.log(data);
    async.waterfall([

        // 连接数据库        
        function (callback) {
            driver.connect(callback, url);
        },
        // insertMany
        function (db, callback) {
            driver.update(db, callback, table, _query, {$set:data});
        },
        function (db, res, callback) {
            driver.close(db, res, callback);
        }
    ],
        // result
        function (err, result) {
            console.log("--updateOne  resulte--");

            if (err) {
                _default.errorHandel(err);
                return;
            }

            if (result.success) {
                _default.successHandel(_default);
            } else {
                _default.errorHandel(err);
            }

        }
    );
};


// 数据库详情更新
spider.updateOneExtra = function (data, _default) {
    var url = _default.mongdb.database;
    var table = _default.mongdb.collection;


    var _query = { "_id": require('mongodb').ObjectId(_default.lastId) };

    console.log(_query);
    async.waterfall([

        // 连接数据库        
        function (callback) {
            driver.connect(callback, url);
        },
        // insertMany
        function (db, callback) {
            driver.update(db, callback, table, _query, {$set:data});
        },
        function (db, res, callback) {
            driver.close(db, res, callback);
        }
    ],
        // result
        function (err, result) {
            console.log("resulte");

            if (err) {
                _default.errorHandel(err);
                return;
            }

            if (result.success) {
                _default.successHandel(_default);
            } else {
                _default.errorHandel(err);
            }

        }
    );
};

// 数据整合比较最新章节的大小
spider.baseConcat = function (data, _default) {
    var url = _default.mongdb.database;
    var table = _default.mongdb.collectionTarget;

    var urlObj = url_node.parse(data['href']);
    var hostname = urlObj.hostname;
    data['domain'] = hostname;

    var _query = { "title": data['title'] };

    console.log(_query);
    async.waterfall([
        // 连接数据库        
        function (callback) {
            driver.connect(callback, url);
        },
        // 
        function (db, callback) {
            driver.find(db, callback, table, _query);
        },
        function (db, res, callback) {
            if (res.success && res.data.length == 0) {
                driver.insert(db, callback, table, data);
            } else if (res.success && res.data.length > 0) {
                var item = res.data[0];

                var news_new = sort(data['news']);
                var news_old = sort(item['news']);
                console.log('--------');
                console.log(news_new);
                console.log(news_old);

                if (news_new != false && news_old!=false) {
                    if (news_old < news_new) {
                        delete data["_id"];
                        Object.assign(item,data);
                        driver.update(db, callback, table, _query, data);
                    } else {
                        callback(null, db, res);
                    }
                } else {
                    callback(null, db, res);
                }

            }
        },
        function (db, res, callback) {
            driver.close(db, res, callback);
        }
    ],
        // result
        function (err, result) {
            console.log("resulte");

            if (err) {
                _default.errorHandel(err);
                return;
            }

            if (result.success) {
                _default.successHandel(_default);
            } else {
                _default.errorHandel(err);
            }

        }
    );
};

module.exports = spider;